package com.dy.数组.高级.基本计算器2;
/*
实现一个基本的计算器来计算一个简单的字符串表达式的值。

字符串表达式仅包含非负整数，+， - ，*，/ 四种运算符和空格  。 整数除法仅保留整数部分。

示例 1:

输入: "3+2*2"
输出: 7
示例 2:

输入: " 3/2 "
输出: 1
示例 3:

输入: " 3+5 / 2 "
输出: 5
说明：

你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval。
 */

import java.util.Stack;

/**
 * 如果该数字之前的符号是加或减，那么把当前数字压入栈中，注意如果是减号，则加入当前数字的相反数，
 * 因为减法相当于加上一个相反数。如果之前的符号是乘或除，那么从栈顶取出一个数字和当前数字进行乘或除的运算，再把结果压入栈中，
 * 那么完成一遍遍历后，所有的乘或除都运算完了，再把栈中所有的数字都加起来就是最终结果了。代码如下：
 */
public class Solution {
    public int calculate(String s) {
        Stack<Integer> stack = new Stack();
        int res = 0;
        int num = 0;
        char op = '+';//用于保存数字之前的符号
        for (int i=0;i<s.length();i++) {
            char c = s.charAt(i);
            //遇到多位数字，如"100+2"
            if (c >= '0' && c <= '9') {
                num = num * 10 + c - '0';
            }
            //如果我是符号，根据前一个符号的情况决定计算方式
            if (c == '+' || c == '-' || c == '*' || c == '/' ||i==s.length()-1) {
                if (op == '+') stack.push(num);
                if (op == '-') stack.push(-num);
                if (op == '*' || op == '/') {
                    int tmp = (op == '*') ? stack.peek() * num : stack.peek() / num;
                    stack.pop();
                    stack.push(tmp);
                }
                op = c;
                num = 0;
            }

        }
        while (!stack.empty()) {
            res += stack.peek();
            stack.pop();

        }
        return res;

    }

    public static void main(String[] args) {
        Solution solution=new Solution();
        String s ="3+2*2";
        solution.calculate(s);
    }
}
